package com.trace.meat.controller;

import com.trace.meat.entity.*;
import com.trace.meat.entityModel.*;
import com.trace.meat.service.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@RestController
@RequestMapping("public")
public class HandleController {
    /**
     * 服务对象
     */
    @Resource
    private OrderTblController orderTblController;
    @Resource
    private EntController entController;
    @Resource
    private EntService entService;
    @Resource
    private AnimalService animalService;
    @Resource
    private ProductService productService;
    @Resource
    private TypeTblService typeTblService;
    @Resource
    private AdminAcctController adminAcctController;
    @Resource
    private AnimalController animalController;
    @Resource
    private ProductController productController;
    @Resource
    private BreederController breederController;
    @Resource
    private ButcherController butcherController;
    @Resource
    private LicController licController;
    @Resource
    private OrderTblService orderTblService;
    @Resource
    private ProcessService processService;

    /**链条合成
     *
     * @param lastoid 最后一个订单号
     * @return Result对象
     */
    /**public Result Chain_From(Integer lastoid) {
        Result result=new Result();
        result.setDetail(null);
        result.setSuccess(false);
        List<OrderTbl> chain_form=orderTblController.Chain_Form(lastoid);
        List<ChainModel> chain=new ArrayList<ChainModel>();
        Iterator it=chain_form.listIterator();
        while (it.hasNext())
        {
            ChainModel chainModel=new ChainModel();
            OrderTbl orderTbl=(OrderTbl)it.next();
            chainModel.setEid(orderTbl.getOutEid());
            chainModel.setEname(entController.selectOne(chainModel.getEid()).getEname());
            chainModel.setTime(orderTbl.getConfirmTime());
            chainModel.setEtype(entService.queryModelById(chainModel.getEid()).getEtype());
            chain.add(chainModel);
            if(!it.hasNext())
            {
                ChainModel temp=new ChainModel(chainModel);
                temp.setEid(orderTbl.getInEid());
                temp.setEtype(entService.queryModelById(temp.getEid()).getEtype());
                temp.setEname(entController.selectOne(temp.getEid()).getEname());
                if(orderTbl.getGtype()==0)//整只
                {
                    AnimalModel animalModel=animalService.queryModelById(orderTbl.getGid());
                    result.setInfo(animalModel);
                }
                else if(orderTbl.getGtype()==1)//切割
                {
                    ProductModel productModel=productService.queryModelById(orderTbl.getGid());
                    result.setInfo(productModel);
                }
                chain.add(temp);
            }
        }
        result.setDetail(chain);
        result.setSuccess(true);
        result.setMsg("获取链条成功");
        return result;
    }*/
    /**获取所有证书类型数据
     *
     * @return Result对象
     */
    public Result getAllLicType() {
        Result result=new Result();
        List<TypeTbl> list=new ArrayList<TypeTbl>();
        for (Integer i=1;i<=100;i++) {
            TypeTbl typeTbl=typeTblService.queryById(i);
            if(typeTbl!=null) {
                list.add(typeTbl);
            }
            else{
                break;
            }
        }
        result.setSuccess(true);
        result.setMsg("所有证书类型查询完成");
        result.setDetail(list);
        return result;
    }


    /**
     * 登录
     *
     * @param username 用户名
     * @param password 密码
     * @return Result对象
     */
    public Result Entlogin(String username,String password)
    {
        return entController.login(username,password);
    }
    /**
     * 注册
     *
     * @param username 用户名
     * @param password 密码
     * @param etype 企业类型
     * @param tele 电话
     * @param ename 企业名
     * @return Result对象
     */
//    public Result EntRegister(String username,String password,Integer etype,String tele,String ename) {
//        return this.entController.register(username,password,etype,tele,ename);
//    }
    /**
     * 管理员登录
     *
     * @param username 用户名
     * @param password 密码
     * @return Result对象
     */
    public Result AdminAcctlogin(String username,String password) {
        return adminAcctController.login(username,password);
    }
    /**
     * 管理员注册
     *
     * @param username 用户名
     * @param password 密码
     * @return Result对象
     */
    public Result AdminAcctRegister(String username,String password) {
        return adminAcctController.register(username,password);
    }
    /**
     * 新增牲畜记录
     *
     * @param  time 出生时间
     * @param  type 类型
     * @param  breed 品种
     * @param  bid 饲养员id
     * @param  lastoid 最新订单号
     * @param  state 出生时间
     * @return 单条数据
     */
    public Result AddAnimal(String time, Integer type, Integer breed,Integer bid,Integer lastoid,short state) {
        Result result=new Result();
        result.setSuccess(false);
        result.setDetail(null);
        Animal animal=animalController.Insert(time,type,breed,bid,lastoid,state);
        if(animal==null)
        {
            result.setMsg("信息错误");
            return result;
        }
        result.setMsg("加入成功");
        result.setSuccess(true);
        result.setDetail(animal);
        return result;
    }
    /**
     * 插入新产品数据
     *
     * @param type 肉品类型
     * @param weight 重量
     * @param time 加工时间
     * @param lastoid 最新订单号
     * @param state 状态
     * @param bid 屠宰着id
     * @param aid 牲畜id
     * @return Result对象
     */
    public Result AddProduct(Integer type, Double weight, String time, Integer lastoid, short state,Integer bid,Integer aid){
        return this.productController.insert(type,weight,time,lastoid,state,bid,aid);
    }
    /**
     * 新增饲养员数据
     *
     * @param bname 饲养员名字
     * @param  eid 企业id
     * @return 单条数据
     */
    public Result AddBreeder(String bname,Integer eid){
        Result result=new Result();
        result.setSuccess(false);
        result.setDetail(null);
        if(entController.selectOne(eid)==null)
        {
            result.setMsg("企业不存在");
            return result;
        }
        result.setDetail(breederController.insert(bname,eid));
        result.setSuccess(true);
        result.setMsg("添加饲养员成功");
        return result;
    }
    /**
     * 新增牲畜经营者数据
     *
     * @param bname 牲畜经营者名字
     * @param  eid 企业id
     * @return Result对象
     */
    public Result AddButcher(String bname, Integer eid){
        Result result=new Result();
        result.setSuccess(false);
        result.setDetail(null);
        if(entController.selectOne(eid)==null)
        {
            result.setMsg("企业不存在");
            return result;
        }
        result.setDetail(butcherController.insert(bname,eid));
        result.setSuccess(true);
        result.setMsg("添加牲畜经营者成功");
        return result;
    }
    /**
     * 新增证书数据
     *
     * @param  eid 企业id
     * @param serNum 证书编号
     * @param licType 证书类型
     * @param licState 证书状态
     * @return Result对象
     */
    public Result AddLic(Integer eid, String serNum,Integer licType,Integer licState){
        Result result=new Result();
        result.setSuccess(false);
        if(entController.selectOne(eid)==null){
            result.setMsg("企业不存在");
            return result;
        }
        result.setDetail(licController.insert(eid,serNum,licType,licState));
        result.setSuccess(true);
        result.setMsg("添加证书信息成功");
        return result;
    }
    /**
     * 查询企业数据
     *
     * @param  eid 企业id
     * @return Result对象
     */
    public Result SelectEnt(Integer eid){
        Result result=new Result();
        result.setSuccess(false);
        Ent ent=new Ent();
        if(ent==null){
            result.setMsg("企业不存在");
            result.setDetail(null);
            return result;
        }
        result.setSuccess(true);
        result.setDetail(ent);
        result.setMsg("查询企业信息成功");
        return result;
    }
    /**
     * 查询牲畜数据
     *
     * @param  aid 牲畜id
     * @return Result对象
     */
    public Result SelectAnimal(Integer aid){
        Result result=new Result();
        result.setSuccess(false);
        AnimalModel animal=animalService.queryModelById(aid);
        if(animal==null){
            result.setMsg("牲畜不存在");
            result.setDetail(null);
            return result;
        }
        result.setDetail(animal);
        result.setMsg("查询牲畜信息成功");
        result.setSuccess(true);
        return result;
    }
    /**
     * 查询产品数据
     *
     * @param  pid 产品id
     * @return Result对象
     */
    public Result SelectProduct(Integer pid){
        Result result=new Result();
        result.setSuccess(false);
        ProductModel product=productService.queryModelById(pid);
        if(product==null){
            result.setMsg("产品不存在");
            result.setDetail(null);
            return result;
        }
        result.setDetail(product);
        result.setMsg("查询产品信息成功");
        result.setSuccess(true);
        return result;
    }






    /**
     * 基本信息
     * @param gid 货物id
     * @param gtype 货物类型
     * @return Result对象
     */
    @Transactional(readOnly=true)
    @GetMapping("ginfo")
    public Result SelectG(Integer gid,Integer gtype){
        if(gtype==0)//整
        {
            return SelectAnimal(gid);
        }
        else if(gtype==1)//切割
        {
            return SelectProduct(gid);
        }
        else {
            Result result=new Result();
            result.setMsg("产品id或产品类型错误");
            result.setSuccess(false);
            return result;
        }
    }
    /**
     * 生成订单链条
     *
     * @param gid 主键
     * @param gtype 货物类型
     * @return 订单链条
     */
    @Transactional(readOnly=true)
    @GetMapping("trace")
    public Result  Chain_Form(Integer gid,Integer gtype){
        Result result=new Result();
        result.setDetail(null);
        result.setSuccess(false);
        Integer id;

        if(gtype==0)//整猪
        {
            if(animalService.queryById(gid)==null){
                result.setMsg("产品id错误或产品类型错误");
                return result;
            }
            id=animalService.queryById(gid).getLastOid();
            if(orderTblService.queryById(id)==null){
                result.setMsg("牲畜信息记录有误");
                return result;
            }
        }
        else if(gtype==1)//切割后
        {
            if(productService.queryById(gid)==null){
                result.setMsg("产品id错误或产品类型错误");
                return result;
            }
            id=productService.queryById(gid).getLastOid();
            if(orderTblService.queryById(id)==null){
                result.setMsg("产品信息记录有误");
                return result;
            }
        }
        else{
            result.setMsg("输入类型错误");
            return result;
        }
        OrderTbl tempOT=this.orderTblService.queryById(id);
        List<OrderTbl> List_OT=new ArrayList<OrderTbl>();
        List_OT.add(tempOT);
        while(tempOT.getLastOid()!=null)
        {
            tempOT=this.orderTblService.queryById(tempOT.getLastOid());
            List_OT.add(0,tempOT);
        }
        Iterator<OrderTbl> iterator= List_OT.listIterator();
        while(iterator.hasNext())
        {
            System.out.println(iterator.next().getOid());
        }
        List<ChainModel> chain=new ArrayList<ChainModel>();
        Iterator it=List_OT.listIterator();
        while (it.hasNext())
        {
            ChainModel chainModel=new ChainModel();
            OrderTbl orderTbl=(OrderTbl)it.next();
            chainModel.setEid(orderTbl.getOutEid());
            EntModel entModel1=entService.queryModelById(chainModel.getEid());
            chainModel.setEname(entModel1.getEname());
            chainModel.setEtype(entModel1.getEtype());
            chainModel.setEid(orderTbl.getOutEid());
            chainModel.setTime(orderTbl.getConfirmTime());
            chain.add(chainModel);
            if(!it.hasNext())
            {
                ChainModel temp=new ChainModel(chainModel);
                temp.setEid(orderTbl.getInEid());
                EntModel entModel2=entService.queryModelById(temp.getEid());
                temp.setEtype(entModel2.getEtype());
                temp.setEname(entModel2.getEname());
                if(gtype==0)//整只
                {
                    AnimalModel animalModel=animalService.queryModelById(gid);
                    result.setInfo(animalModel);
                }
                else if(gtype==1)//切割
                {
                    ProductModel productModel=productService.queryModelById(gid);
                    AnimalModel animalModel=animalService.queryModelById((processService.queryByPId(productModel.getPid())).getAid());
                    PAModel paModel=new PAModel();
                    paModel.setAnimalModel(animalModel);
                    paModel.setProductModel(productModel);
                    result.setInfo(paModel);
                }
                chain.add(temp);
            }
        }
        result.setDetail(chain);
        result.setMsg("链条合成成功");
        result.setSuccess(true);
        return result;
    }




    /**
     * 查询牲畜经营者数据
     *
     * @param  bid 经营者id
     * @return Result对象
     */
    public Result SelectButcher(Integer bid){
        Result result=new Result();
        result.setSuccess(false);
        Butcher butcher=butcherController.selectOne(bid);
        if(butcher==null){
            result.setMsg("牲畜不存在");
            result.setDetail(null);
            return result;
        }
        result.setDetail(butcher);
        result.setMsg("查询牲畜信息成功");
        result.setSuccess(true);
        return result;
    }
    /**
     * 查询饲养员数据
     *
     * @param  bid 饲养员id
     * @return Result对象
     */
    public Result SelectBreeder(Integer bid){
        Result result=new Result();
        result.setSuccess(false);
        Breeder breeder=breederController.selectOne(bid);
        if(breeder==null){
            result.setMsg("牲畜不存在");
            result.setDetail(null);
            return result;
        }
        result.setDetail(breeder);
        result.setMsg("查询牲畜信息成功");
        result.setSuccess(true);
        return result;
    }


}
